// =====================================================================================
// 
//       Filename:  GiocatoreComputer.cpp
// 
//    Description:  Implementazione della classe GiocatoreComputer
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================

#include "GiocatoreComputer.hh"

GiocatoreComputer::GiocatoreComputer(int dim_mare, int livello) : Giocatore(dim_mare)
{
    switch (livello){
        case 1 : _strategia = new StrategiaRandom();
                 break;
        case 2 : _strategia = new StrategiaFurba();
                 break;
        case 3 : _strategia = new StrategiaPiuFurba();
                 break;
        default: cout << "Giocatore Computer: errore nella scelta del livello" << endl; 
    }
    srand(time(0));
}

GiocatoreComputer::~GiocatoreComputer() 
{
    delete _strategia;
    delete _nave_colpite;
    delete _nave_affondate;
    list<Nave*>::iterator nave;
    for (nave = _navi_mie.begin(); nave != _navi_mie.end(); nave++){
        delete (*nave);
    }
}

pair<int,int>  GiocatoreComputer::spara()
{
    cout << "Il tuo mare" << endl;
    cout << _mare_mio << endl;
    cout << "Il mare avversario" << endl;
    cout << _mare_avv << endl;
    pair<int,int> coor = _strategia->spara(_mare_avv);
    cout << "Colpo sparato dal computer:" <<endl;
    cout << "x: " << coor.first + 1 << endl;
    cout << "y: " << coor.second + 1 << endl;
    return coor;
}

int GiocatoreComputer::posiziona_nave()    
{
    int area_navi = 0;
    list<Nave*>::iterator nave;
    for (nave = _navi_mie.begin(); nave != _navi_mie.end(); nave++){
        area_navi += (*nave)->dimensione()*3 + 6;
    }
	if(area_navi >= _mare_mio.dim_mare()*_mare_mio.dim_mare()*2/3){
		return 0;
	}
    int dim_nave = rand()%5 + 1;
    posiziona_nave(dim_nave);
    return dim_nave;
}

int GiocatoreComputer::posiziona_nave(int dim_nave) 
{
    pair<int, int> posizione;
    int orientamento;
    do {
        posizione = _strategia->coor_random(_mare_avv);
        orientamento = rand()%4;
    } while (!(_mare_mio.ci_sta_nave(posizione, orientamento, dim_nave)));
    Nave* nave = crea_nave(dim_nave, posizione, orientamento);
    _navi_mie.push_back(nave);
    _mare_mio.inserisci_nave(nave);
    return dim_nave;
}

